home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Rozne / HTTrack 3.40-2 / httrack-3.40-2.exe / {app} / src_win / WinHTTrack / splitter.cpp < prev    next >
C/C++ Source or Header  |  2004-01-24  |  14KB  |  476 lines

  1. // splitter.cpp : implementation file
  2. //
  3.  
  4. #include "resource.h"
  5. #include "stdafx.h"
  6. #include "splitter.h"
  7. #include "DialogContainer.h"
  8. #include "cpp_lang.h"
  9.  
  10. #include "afxpriv.h"
  11.  
  12. // CDirTreeView
  13. #include "DirTreeView.h"
  14.  
  15. // Pointeur sur nous
  16. #include "WinHTTrack.h"
  17. extern CWinHTTrackApp* this_app;
  18.  
  19. #include "htsbase.h"
  20.  
  21. #ifdef _DEBUG
  22. #undef THIS_FILE
  23. static char BASED_CODE THIS_FILE[] = __FILE__;
  24. #endif
  25.  
  26. extern "C" {
  27.   #include "HTTrackInterface.h"
  28. };
  29.  
  30. static UINT indicators[] =
  31. {
  32.     ID_SEPARATOR,           // status line indicator
  33.     ID_INDICATOR_CAPS,
  34.     ID_INDICATOR_NUM,
  35.     ID_INDICATOR_SCRL,
  36. };
  37.  
  38. // splitter frame
  39. extern CSplitterFrame* this_CSplitterFrame;
  40. // termine flag
  41. extern int termine;
  42.  
  43. /* DirTreeView */
  44. #include "DirTreeView.h"
  45. extern CDirTreeView* this_DirTreeView;
  46.  
  47.  
  48.  
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CSplitterFrame
  51.  
  52. // Create a splitter window which splits an output text view and an input view
  53. //                           |
  54. //    TEXT VIEW (CTextView)  | INPUT VIEW (CInputView)
  55. //                           |
  56.  
  57. IMPLEMENT_DYNCREATE(CSplitterFrame, CMDIChildWnd)
  58.  
  59. CSplitterFrame::CSplitterFrame()
  60. {
  61.   this_CSplitterFrame=this;
  62. }
  63.  
  64. CSplitterFrame::~CSplitterFrame()
  65. {
  66.   this_CSplitterFrame=NULL;
  67. }
  68.  
  69. #define wm_IcnRest (WM_USER + 16)
  70. BEGIN_MESSAGE_MAP(CSplitterFrame, CMDIChildWnd)
  71.     //{{AFX_MSG_MAP(CSplitterFrame)
  72.     ON_WM_MDIACTIVATE()
  73.     ON_WM_CLOSE()
  74.     //}}AFX_MSG_MAP
  75.   ON_MESSAGE( wm_IcnRest, IconRestore )
  76. END_MESSAGE_MAP()
  77. //
  78.  
  79. // Iconify
  80. void CSplitterFrame::Onhide() 
  81. {
  82.   if (!iconifie) {
  83.     //icnd.hWnd=this->GetMainWnd()->m_hWnd;
  84.     //icnd.hWnd=AfxGetMainWnd()->m_hWnd;
  85.     icnd.hWnd=this_CSplitterFrame->m_hWnd;
  86.     strcpybuff(icnd.szTip,"WinHTTrack Website Copier");
  87.     /* */
  88.     AfxGetMainWnd()->ShowWindow(SW_HIDE);
  89.     //ShowWindow(SW_SHOWMINNOACTIVE);
  90.     Shell_NotifyIcon(NIM_ADD,&icnd);
  91.     iconifie=true;
  92.   } else {
  93.     CheckRestore();
  94.   }
  95. }
  96.  
  97. LRESULT CSplitterFrame::IconRestore(WPARAM wParam,LPARAM lParam) {
  98.   if (iconifie) {
  99.     POINT point;
  100.     GetCursorPos(&point);
  101.     //ScreenToClient(&point);
  102.     int msg=(UINT) lParam;
  103.     if (msg==WM_RBUTTONDOWN) {  // menu      
  104.       CMenu menu;
  105.       VERIFY(menu.LoadMenu(IDR_POPUP));
  106.       CMenu* pPopup = menu.GetSubMenu(0);
  107.       ASSERT(pPopup != NULL); 
  108.       pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,
  109.         point.x, point.y, AfxGetMainWnd());
  110.     } else if (msg==WM_LBUTTONDBLCLK) {
  111.       CheckRestore();
  112.     }
  113.   }
  114.   return 0;
  115. }
  116.  
  117. void CSplitterFrame::IconChange(CString st) {
  118.   if (iconifie) {
  119.     strcpybuff(icnd.szTip,"");
  120.     strncatbuff(icnd.szTip,st,60);
  121.     Shell_NotifyIcon(NIM_MODIFY,&icnd);
  122.   }
  123. }
  124.  
  125. void CSplitterFrame::CheckRestore() {
  126.   if (iconifie) {
  127.     Shell_NotifyIcon(NIM_DELETE,&icnd);
  128.     //if (!termine) {
  129.     if (AfxGetMainWnd()) {
  130.       if (AfxGetMainWnd()->m_hWnd) {
  131.         AfxGetMainWnd()->ShowWindow(SW_RESTORE);
  132.         AfxGetMainWnd()->SetForegroundWindow();
  133.       }
  134.     }
  135.     iconifie=false;
  136.   }
  137. }
  138. // FIN Iconify
  139.  
  140.  
  141. BOOL CSplitterFrame::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle , const RECT& rect , CMDIFrameWnd* pParentWnd , CCreateContext* pContext ) {
  142.   /* recrΘer control tabs */
  143.   this_app->NewTabs();
  144.  
  145.   // Enlever bordure fenΩtre, et mettre en plein Θcran (pas de fenΩtre dans la fenΩtre!!)
  146.   dwStyle&=(~(WS_MINIMIZEBOX|WS_BORDER|WS_CAPTION|WS_OVERLAPPED|WS_OVERLAPPEDWINDOW));
  147.   dwStyle|=(WS_MAXIMIZE);
  148.   int r=CMDIChildWnd::Create(lpszClassName,lpszWindowName,dwStyle ,rect ,pParentWnd ,pContext );
  149.   if (r) {
  150.     // Mettre en maximisΘ
  151.     WINDOWPLACEMENT pl;
  152.     RECT rc;
  153.     rc.top=0;
  154.     rc.left=0;
  155.     rc.bottom=200;
  156.     rc.right=400;
  157.     pl.length=sizeof(pl);
  158.     pl.flags=WPF_RESTORETOMAXIMIZED;
  159.     pl.showCmd=SW_SHOWMAXIMIZED;
  160.     pl.rcNormalPosition=rc;
  161.     SetWindowPlacement(&pl);
  162.   }
  163.  
  164.   // iconification
  165.   iconifie=false;
  166.   icnd.cbSize=sizeof(NOTIFYICONDATA);
  167.   icnd.uID=0;              // euhh id=0
  168.   icnd.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
  169.   icnd.uCallbackMessage=wm_IcnRest;  // notre callback
  170.   icnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  171.  
  172.   // Retourner rΘsultat
  173.   return r;
  174. }
  175.  
  176. static TCHAR BASED_CODE szSection[] = _T("Settings");
  177. static TCHAR BASED_CODE szWindowPos[] = _T("SplitterPos");
  178. BOOL CSplitterFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) 
  179. {
  180.   /*
  181.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  182.         | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  183.         !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  184.     {
  185.         TRACE0("Failed to create toolbar\n");
  186.         return -1;      // fail to create
  187.     }
  188.  
  189.     if (!m_wndStatusBar.Create(this) ||
  190.         !m_wndStatusBar.SetIndicators(indicators,
  191.           sizeof(indicators)/sizeof(UINT)))
  192.     {
  193.         TRACE0("Failed to create status bar\n");
  194.         return -1;      // fail to create
  195.     }
  196.     // TODO: Delete these three lines if you don't want the toolbar to
  197.     //  be dockable
  198.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  199.     EnableDocking(CBRS_ALIGN_ANY);
  200.     DockControlBar(&m_wndToolBar);
  201.   */
  202.   //
  203.  
  204.     // create a splitter with 1 row, 2 columns
  205.     if (!m_wndSplitter.CreateStatic(this, 1, 2))
  206.     {
  207.         TRACE0("Failed to CreateStaticSplitter\n");
  208.         return FALSE;
  209.     }
  210.  
  211.     // add the first splitter pane - the default view in column 0
  212.     /*if (!m_wndSplitter.CreateView(0, 0,
  213.         pContext->m_pNewViewClass, CSize(130, 50), pContext))
  214.     {
  215.         TRACE0("Failed to create first pane\n");
  216.         return FALSE;
  217.     }*/
  218.  
  219.   int PaneW=200,PaneH=50;
  220.   {
  221.     CString strBuffer = AfxGetApp()->GetProfileString(szSection, szWindowPos);
  222.     if (!strBuffer.IsEmpty()) {
  223.       int rx=0,ry=0;
  224.       if (sscanf(strBuffer,"%d,%d",&rx,&ry)==2) {
  225.         PaneW=rx;
  226.         PaneH=ry;
  227.       }
  228.     }
  229.   }
  230.  
  231.     // add the second splitter pane - an input view in column 1
  232.  
  233.     if (!m_wndSplitter.CreateView(0, 0,
  234.         RUNTIME_CLASS(CDirTreeView), CSize(PaneW, PaneH), pContext))
  235.     {
  236.         TRACE0("Failed to create second pane\n");
  237.         return FALSE;
  238.     }
  239.   if (this_DirTreeView)
  240.     this_DirTreeView->docType=".whtt";
  241.  
  242.     // add the second splitter pane - an input view in column 1
  243.     if (!m_wndSplitter.CreateView(0, 1,
  244.         RUNTIME_CLASS(CDialogContainer), CSize(0,0), pContext))
  245.     {
  246.         TRACE0("Failed to create second pane\n");
  247.         return FALSE;
  248.     }
  249.  
  250.   //m_wndSplitter.SetColumnInfo(1,800,400);
  251.  
  252.   // menu entries - done with MDIactivate
  253.   //SetMenuPrefs();
  254.  
  255.   // activate the input view
  256.     SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
  257.  
  258.     return TRUE;
  259. }
  260.  
  261. CSplitterWnd* CSplitterFrame::GetSplitter() {
  262.   return &m_wndSplitter;
  263. }
  264.  
  265. BOOL CSplitterFrame::SetNewView(int row, int col, CRuntimeClass* pViewClass) {
  266.   ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));
  267.   
  268.   CView* pView = STATIC_DOWNCAST(CView, m_wndSplitter.GetPane(row, col));
  269.   CFrameWnd* pFrame = pView->GetParentFrame();
  270.   ASSERT(pFrame);
  271.   
  272.   // set up create context to preserve doc/frame etc.
  273.   CCreateContext cc;
  274.   memset(&cc, sizeof(cc), 0);
  275.   cc.m_pNewViewClass = pViewClass;
  276.   cc.m_pCurrentDoc = pView->GetDocument();
  277.   cc.m_pNewDocTemplate = cc.m_pCurrentDoc ?
  278.     cc.m_pCurrentDoc->GetDocTemplate() : NULL;
  279.   cc.m_pCurrentFrame = pFrame;
  280.   
  281.   m_wndSplitter.DeleteView(row, col);                // delete old view
  282.  
  283.   /* */
  284.   /* recrΘer control tabs */
  285.   this_app->NewTabs();
  286.   /* */
  287.  
  288.   VERIFY(m_wndSplitter.CreateView(row, col,          // create new one
  289.     pViewClass,
  290.     CSize(0,0),                      // will fix in RecalcLayout
  291.     &cc));
  292.   
  293.   m_wndSplitter.RecalcLayout();                      // recompute layout 
  294.   
  295.   // initialize the view
  296.   CWnd* pWnd = m_wndSplitter.GetPane(row, col);
  297.   if (pWnd)
  298.     pWnd->SendMessage(WM_INITIALUPDATE);
  299.  
  300.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document vide
  301.   GetActiveDocument()->SetTitle("New Project");
  302.   //SetDefaultTitle(GetActiveDocument());
  303.   return 1;
  304. }
  305.  
  306. BOOL CSplitterFrame::SetSaved() {
  307.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document sauvΘ
  308.   return 1;
  309. }
  310.  
  311. // Nommer le document
  312. BOOL CSplitterFrame::SetNewName(CString name) {
  313.   GetActiveDocument()->SetPathName(name);
  314.   int pos=max(name.ReverseFind('\\'),name.ReverseFind('/'))+1;
  315.   GetActiveDocument()->SetTitle(name.Mid(pos));
  316.   GetActiveDocument()->SetModifiedFlag();
  317.   return 1;
  318. }
  319.  
  320. BOOL CSplitterFrame::SetCurrentCategory(CString name) {
  321.   m_projcateg = name;
  322.   return TRUE;
  323. }
  324.  
  325. CString CSplitterFrame::GetCurrentCategory() {
  326.   return m_projcateg;
  327. }
  328.  
  329.  
  330. void CSplitterFrame::EnableExtEntries(BOOL state) {
  331.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  332.   if (menu) {
  333.     int status;
  334.     if (!state)
  335.       status=MF_GRAYED; 
  336.     else
  337.       status=MF_ENABLED; 
  338.     menu->EnableMenuItem(2,status|MF_BYPOSITION);
  339.     menu->EnableMenuItem(3,status|MF_BYPOSITION);
  340.     
  341.     GetParent()->GetParent()->DrawMenuBar();
  342.   }
  343. }
  344.  
  345. void CSplitterFrame::EnableSaveEntries(BOOL state) {
  346.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  347.   if (menu) {
  348.     int status;
  349.     if (!state)
  350.       status=MF_GRAYED; 
  351.     else
  352.       status=MF_ENABLED; 
  353.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  354.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  355.     GetParent()->GetParent()->DrawMenuBar();
  356.   }
  357. }
  358.  
  359. void CSplitterFrame::SetMenuPrefs() {
  360.   if (LANG_T(-1)) {    // Patcher en franτais
  361.     CMenu* menu = GetParent()->GetParent()->GetMenu();
  362.     if (menu) {
  363.       ModifyMenuCP(menu, 0,MF_BYPOSITION,0,LANG(LANG_P1));
  364.       ModifyMenuCP(menu, 1,MF_BYPOSITION,1,LANG(LANG_P2));
  365.       ModifyMenuCP(menu, 2,MF_BYPOSITION,2,LANG(LANG_P3));
  366.       ModifyMenuCP(menu, 3,MF_BYPOSITION,0,LANG(LANG_P4));
  367.       ModifyMenuCP(menu, 4,MF_BYPOSITION,1,LANG(LANG_P5));
  368.       ModifyMenuCP(menu, 5,MF_BYPOSITION,2,LANG(LANG_P6));
  369.       //
  370.       ModifyMenuCP(menu, ID_FILE_NEW ,MF_BYCOMMAND,ID_FILE_NEW,LANG_P18);
  371.       ModifyMenuCP(menu, ID_FILE_OPEN ,MF_BYCOMMAND,ID_FILE_OPEN,LANG_P19);
  372.       ModifyMenuCP(menu, ID_FILE_SAVE ,MF_BYCOMMAND,ID_FILE_SAVE,LANG_P20);
  373.       ModifyMenuCP(menu, ID_FILE_SAVE_AS ,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG_P21);
  374.       ModifyMenuCP(menu, ID_FILE_DELETE_PROJ ,MF_BYCOMMAND,ID_FILE_DELETE_PROJ,LANG_P22);
  375.       ModifyMenuCP(menu, ID_FILE_BROWSE_SIT ,MF_BYCOMMAND,ID_FILE_BROWSE_SIT,LANG_P23);
  376.       ModifyMenuCP(menu, ID_APP_EXIT,MF_BYCOMMAND,ID_APP_EXIT,LANG(LANG_P10));
  377.       ModifyMenuCP(menu, ID_LoadDefaultOptions,MF_BYCOMMAND,ID_LoadDefaultOptions,LANG(LANG_P11));
  378.       ModifyMenuCP(menu, ID_SaveProject,MF_BYCOMMAND,ID_SaveProject,LANG_SAVEPROJECT);
  379.       ModifyMenuCP(menu, ID_NewProjectImport,MF_BYCOMMAND,ID_NewProjectImport,LANG(LANG_P18));
  380.       ModifyMenuCP(menu, ID_SaveDefaultOptions,MF_BYCOMMAND,ID_SaveDefaultOptions,LANG(LANG_P12));
  381.       ModifyMenuCP(menu, ID_ClearDefaultOptions,MF_BYCOMMAND,ID_ClearDefaultOptions,LANG(LANG_P12b));
  382.       ModifyMenuCP(menu, ID_LOAD_OPTIONS,MF_BYCOMMAND,ID_FILE_OPEN,LANG(LANG_P13));
  383.       ModifyMenuCP(menu, ID_FILE_SAVE_OPTIONS_AS,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG(LANG_P14));
  384.       ModifyMenuCP(menu, IDC_langprefs,MF_BYCOMMAND,IDC_langprefs,LANG(LANG_P15));
  385.       ModifyMenuCP(menu, ID_HELP,MF_BYCOMMAND,ID_HELP,LANG(LANG_P16));
  386.       ModifyMenuCP(menu, IDC_ipabout,MF_BYCOMMAND,IDC_ipabout,LANG(LANG_P17));
  387.       //
  388.       /*
  389.       ModifyMenuCP(menu, 0,MF_BYPOSITION,0,LANG(LANG_O1));
  390.       ModifyMenuCP(menu, 1,MF_BYPOSITION,1,LANG(LANG_O2));
  391.       ModifyMenuCP(menu, 2,MF_BYPOSITION,2,LANG(LANG_O3));
  392.       ModifyMenuCP(menu, 3,MF_BYPOSITION,3,LANG(LANG_O4));
  393.       ModifyMenuCP(menu, 4,MF_BYPOSITION,4,LANG(LANG_O5));
  394.       */
  395.       //
  396.       ModifyMenuCP(menu, ID_FILE_PAUSE,MF_BYCOMMAND,ID_FILE_PAUSE,LANG(LANG_O10));
  397.       ModifyMenuCP(menu, ID_FILE_EXIT,MF_BYCOMMAND,ID_FILE_EXIT,LANG(LANG_O11));
  398.       ModifyMenuCP(menu, ID_OPTIONS_MODIFY,MF_BYCOMMAND,ID_OPTIONS_MODIFY,LANG(LANG_O12));
  399.       ModifyMenuCP(menu, ID_LOG_VIEWLOG,MF_BYCOMMAND,ID_LOG_VIEWLOG,LANG(LANG_O13));
  400.       ModifyMenuCP(menu, ID_LOG_VIEWERRORLOG,MF_BYCOMMAND,ID_LOG_VIEWERRORLOG,LANG(LANG_O14));
  401.       ModifyMenuCP(menu, ID_LOG_VIEWTRANSFERS,MF_BYCOMMAND,ID_LOG_VIEWTRANSFERS,LANG(LANG_O14b));
  402.       ModifyMenuCP(menu, ID_WINDOW_HIDE,MF_BYCOMMAND,ID_WINDOW_HIDE,LANG(LANG_O15));
  403.       //ModifyMenuCP(menu, ID_VIEW_TOOLBAR,MF_BYCOMMAND,ID_VIEW_TOOLBAR,LANG(LANG_O18));
  404.       ModifyMenuCP(menu, ID_VIEW_STATUS_BAR,MF_BYCOMMAND,ID_VIEW_STATUS_BAR,LANG(LANG_O19));
  405.       ModifyMenuCP(menu, ID_WINDOW_SPLIT,MF_BYCOMMAND,ID_WINDOW_SPLIT,LANG(LANG_O20));      
  406.       ModifyMenuCP(menu, ID_ABOUT,MF_BYCOMMAND,ID_ABOUT,LANG(LANG_O16));
  407.       ModifyMenuCP(menu, ID_UPDATE,MF_BYCOMMAND,ID_UPDATE,LANG(LANG_O17));
  408.       //
  409.       GetParent()->GetParent()->DrawMenuBar();
  410.     }
  411.   }
  412. }
  413.  
  414.  
  415. /////////////////////////////////////////////////////////////////////////////
  416. //
  417.  
  418. IMPLEMENT_DYNAMIC(CViewExSplitWnd, CSplitterWnd)
  419.  
  420. CViewExSplitWnd::CViewExSplitWnd()
  421. {
  422. }
  423.  
  424. CViewExSplitWnd::~CViewExSplitWnd()
  425. {
  426. }
  427.  
  428. CWnd* CViewExSplitWnd::GetActivePane(int* pRow, int* pCol)
  429. {
  430.     ASSERT_VALID(this);
  431.  
  432.     // attempt to use active view of frame window
  433.     CWnd* pView = NULL;
  434.     CFrameWnd* pFrameWnd = GetParentFrame();
  435.     ASSERT_VALID(pFrameWnd);
  436.     pView = pFrameWnd->GetActiveView();
  437.  
  438.     // failing that, use the current focus
  439.     if (pView == NULL)
  440.         pView = GetFocus();
  441.  
  442.     return pView;
  443. }
  444.  
  445. //
  446.  
  447. /* Activation du MDI */
  448. void CSplitterFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd) 
  449. {
  450.     CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
  451.   SetMenuPrefs();
  452.   /* disable ext. entries by default */
  453.   this_CSplitterFrame->EnableExtEntries(FALSE);
  454.   this_CSplitterFrame->EnableSaveEntries(TRUE);
  455.  
  456.   if (!bActivate) {
  457.     int cxCur,cxMin;
  458.     TCHAR szBuffer[sizeof("-32767")*8];
  459.     m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  460.     sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  461.       AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  462.   }
  463. }
  464.  
  465.  
  466. void CSplitterFrame::OnClose() 
  467. {
  468.   int cxCur,cxMin;
  469.   TCHAR szBuffer[sizeof("-32767")*8];
  470.   m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  471.   sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  472.     AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  473.  
  474.     CMDIChildWnd::OnClose();
  475. }
  476.